package com.ipartek.formacion.colecciones;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class CronometroColeccionUlises {
	static int cantidad = 1000000;
	public static int CANTIDAD_VUELTAS = 100;
	static int[] arrayEnteros = new int[cantidad];
	static ArrayList<Integer> arrayListEnteros = new ArrayList<Integer>();
	static ArrayList<Long> resultadosArray = new ArrayList<Long>();
	static ArrayList<Long> resultadosArrayList = new ArrayList<Long>();
	static ArrayList<Long> resultadosIterator = new ArrayList<Long>();
	static Iterator<Integer> it;

	/**
	 * Metodo para recorrer un array, un arraylist y un ararylist con iterator
	 * Almacena los tiempos de recorrido de cada uno los arrayList de resultados
	 * correspondientes.
	 */
	public static void generarIteraciones() {
		// System.out.println("******ARRAY********");
		long iniArray = System.currentTimeMillis();

		for (int i = 0; i < arrayEnteros.length; i++) {
			arrayEnteros[i]++;

		}

		long finArray = System.currentTimeMillis();

		// System.out.println("******ARRAYLIST********");
		long iniArrayList = System.currentTimeMillis();

		for (int i = 0; i < arrayListEnteros.size(); i++) {
			arrayListEnteros.set(i, arrayListEnteros.get(i) + 1);

		}

		long finArrayList = System.currentTimeMillis();
		// System.out.println("******ARRAYLIST - ITERATOR********");

		long iniIterator = System.currentTimeMillis();

		while (it.hasNext()) {

			it.next();

		}

		long finIterator = System.currentTimeMillis();
		// System.out.println("\n******RESULTADOS********");
		resultadosArray.add(finArray - iniArray);
		resultadosArrayList.add(finArrayList - iniArrayList);
		resultadosIterator.add(finIterator - iniIterator);

	}

	public static void main(String[] args) {

		Random randomGenerator = new Random(System.currentTimeMillis());
		int randomInt = 0;
		// Alamcenar numeros aleatorios en el array y en el arrayList
		for (int i = 0; i < arrayEnteros.length; i++) {
			randomInt = randomGenerator.nextInt(50);
			arrayEnteros[i] = randomInt;
			arrayListEnteros.add(randomInt);
		}

		// Asignar el Iterator
		it = arrayListEnteros.iterator();

		// Llamar un numero de veces al metodo para generar iteraciones y
		// almacenar resultados
		for (int i = 0; i < CANTIDAD_VUELTAS; i++) {
			generarIteraciones();
		}
		// variables para el calculo de medias
		long contadorArray = 0;
		long contadorArrayList = 0;
		long contadorIterator = 0;
		for (int i = 0; i < resultadosArray.size(); i++) {
			contadorArray += resultadosArray.get(i);
			contadorArrayList += resultadosArrayList.get(i);
			contadorIterator += resultadosIterator.get(i);
		}
		// Resultados por pantalla de las medias
		System.out.println("\n******RESULTADOS********");

		System.out.println("Array ha tardado de media " + contadorArray
				/ CANTIDAD_VUELTAS + " msg.");
		System.out.println("ArrayList ha tardado de media " + contadorArrayList
				/ CANTIDAD_VUELTAS + " msg.");
		System.out.println("Iterator ha tardado de media "
				+ (contadorIterator / CANTIDAD_VUELTAS) + " msg.");

	}
}
